﻿using System;
using System.Collections.Generic;
using Bastanteo.Dominio;
using Bastanteo.Persistencia;
using NUnit.Framework;

namespace Bastanteo.Pruebas
{
    [TestFixture]
    public class Test2_GrupoDAO
    {
        IGrupoDAO dao = null;
        Grupo creado = null;
        
        [TestFixtureSetUp]
        public void InicializarPruebas()
        {
            dao = new Persistencia.NH.GrupoDAO(); // Instanciamos la implementación elegida (ADO o NHibernate)
            foreach (Grupo grupo in dao.ListarTodos())
                dao.Eliminar(grupo);
        }

        [Test]
        public void Test1_Crear()
        {
            // 1. Validar que ocurra un error al intentar crear un Grupo con un dato nulo
            Grupo grupoACrear = new Grupo();
            
            Assert.Catch<Exception>(delegate
            {
                creado = dao.Crear(grupoACrear);
            });
            // 2. Validar que se cree un Grupo correctamente (sin error)
            grupoACrear.Descripcion = "A";
            Assert.DoesNotThrow(delegate
            {
                creado = dao.Crear(grupoACrear);
            });
            // 3. Validar que el grupo creado no sea nulo, tenga un código mayor a 0 y la descripción sea la ingresada
            Assert.IsNotNull(creado);
            Assert.Greater(creado.CodigoGrupo, 0);
            Assert.AreEqual(creado.Descripcion, grupoACrear.Descripcion);
        }
        [Test]
        public void Test2_Obtener()
        {
            Grupo grupoObtenido = null;
            // 1. Validar que se retorne nulo al obtener un grupo inexistente
            Assert.DoesNotThrow(delegate
            {
                grupoObtenido = dao.Obtener(1000);
            });
            Assert.IsNull(grupoObtenido);
            // 2. Validar que se obtenga el grupo creado satisfactoriamente
            Assert.DoesNotThrow(delegate
            {
                grupoObtenido = dao.Obtener(creado.CodigoGrupo);
            });
            Assert.IsNotNull(grupoObtenido);
            // 3. Validar que la descripcion obtenida sea la creada anteriormente
            Assert.AreEqual(grupoObtenido.Descripcion, "A"); //
        }
        [Test]
        public void Test3_Modificar()
        {
            Grupo grupoAModificar = dao.Obtener(creado.CodigoGrupo);
            grupoAModificar.Descripcion = null;
            Grupo grupoModificado = null;
            // 1. Validar que ocurrar un error al intentar modificar el Grupo con un tipo de empresa nulo
            Assert.Catch<Exception>(delegate
            {
                grupoModificado = dao.Modificar(grupoAModificar);
            });
            // 2. Validar que se modifique correctamente el cliente
            grupoAModificar.Descripcion = "B";
            Assert.DoesNotThrow(delegate
            {
                grupoModificado = dao.Modificar(grupoAModificar);
            });
            // 3. Validar que el Grupo modificado no sea nulo, tenga la razón social, número de empleados y tipo indicados
            Assert.IsNotNull(grupoModificado);
            Assert.AreEqual(grupoAModificar.Descripcion, grupoModificado.Descripcion);
        }
        [Test]
        public void Test4_Eliminar()
        {
            Grupo grupoAEliminar = dao.Obtener(creado.CodigoGrupo);
            // 1. Validar que ocurre un error si se intenta eliminar un Grupo nulo
            Assert.Catch<Exception>(delegate
            {
                dao.Eliminar(null);
            });
            // 2. Validar que se elimina correctamente el Grupo creado
            Assert.DoesNotThrow(delegate
            {
                dao.Eliminar(grupoAEliminar);
            });
            // 3. Validar que luego de eliminado se retorne nulo al obtenerlo
            Grupo clienteEliminado = dao.Obtener(creado.CodigoGrupo);
            Assert.IsNull(clienteEliminado);

        }
        [Test]
        public void Test5_Listar()
        {
            dao.Crear(new Grupo() { Descripcion = "A" });
            dao.Crear(new Grupo() { Descripcion = "B" });
            // 1. Validar que se listen los grupos existentes exitosamente
            ICollection<Grupo> gruposExistentes = null;
            Assert.DoesNotThrow(delegate
            {
                gruposExistentes = dao.ListarTodos();
            });
            // 2. Validar que se retornen al menos los 2 clientes creados previamente
            Assert.GreaterOrEqual(gruposExistentes.Count, 2);
            // 3. Validar que cada Grupo obtenido tenga una descripcion no nula
            foreach (Grupo grupo in gruposExistentes)
                Assert.IsNotNull(grupo.Descripcion);
        }

        [TestFixtureTearDown]
        public void FinalizarPruebas()
        {
            foreach (Grupo Grupo in dao.ListarTodos()) 
                dao.Eliminar(Grupo);
            Persistencia.NH.NHibernateHelper.CerrarFabrica();
        }
    }
}